/**
 *
 */
package platform.common.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import platform.common.bo.IPersistenceBO;
import platform.common.bo.Page;
import platform.common.dao.impl.DaoConfigException;
import platform.common.dao.impl.DaoException;


import platform.common.dao.IDomainProvider;

/**
 * @author daizs
 *
 */
public interface IBaseDao {
	@SuppressWarnings("unchecked")
	public List getBySql(final String sql, final Class cls) throws DaoException;
	/**
	 * 保存普通业务对象
	 *
	 * @param object
	 * @throws Exception
	 */
	public void add(IPersistenceBO object) throws DaoException;


	/**
	 * 修改普通业务对象
	 *
	 * @param object
	 */
	public void update(IPersistenceBO object) throws DaoException;
	/**
	 * 删除指定的普通业务对象
	 *
	 * @param object
	 * @throws Exception
	 */
	public void delete(IPersistenceBO object) throws DaoException;
	/**
	 * 依据主键和领域名称删除指定的普通业务对象
	 *
	 * @param oid
	 * @param domainProvider 领域提供者
	 * @throws Exception
	 */
	public void deleteById(IDomainProvider domainProvider, Serializable oid)throws DaoException, DaoConfigException;
	public void deleteById(Serializable oid)throws DaoException, DaoConfigException;
	/**
	 * 保存或者修改某个对象
	 *
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public Object saveOrUpdate(IPersistenceBO obj) throws DaoException;

	/**
	 * 依据Id和领域名称查询所有记录
	 *
	 * @param oid 领域对象Id
	 * @param domainProvider 领域提供者
	 * @return 领域对象
	 * @throws DaoException, DaoConfigException
	 */
	public <T>T findByIdAndDomain(IDomainProvider domainProvider, Serializable oid)throws DaoException, DaoConfigException;
	public  <T>T  findByIdAndDomain(Serializable oid)throws DaoException, DaoConfigException;
	/**
	 * 依据领域名称查询所有记录
	 *
	 * @param domainProvider 领域提供者
	 * @return 领域列表
	 * @throws DaoException, DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public List findAllByDomian(IDomainProvider domainProvider) throws DaoException,DaoConfigException;
	/**
	 * <br/>方法描述:依据领域名称查询所有记录,并按分页获取
	 * @param domainProvider 领域提供者
	 * @return 领域列表
	 */
	@SuppressWarnings("unchecked")
	public List findAllByDomian(IDomainProvider domainProvider,Page page)
			throws DaoException, DaoConfigException;
	/**
	 * 依据领域名称和查询定义别名查询记录
	 * @param domainProvider 领域提供者
	 * @param queryName 查询定义别名
	 * @param qryParams 查询参数数组
	 * @return 领域列表
	 * @throws DaoException, DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public List findByHqlNameAndDomian(IDomainProvider domainProvider, String queryName,Object[] qryParams) throws DaoException, DaoConfigException;
	@SuppressWarnings("unchecked")
	public List findByHqlNameAndDomian(String queryName,Object[] qryParams) throws DaoException, DaoConfigException;
	/**
	 * 依据领域名称和查询定义别名查询记录
	 * @param domainProvider 领域提供者
	 * @param queryName 查询定义别名
	 * @param qryParams 查询参数Map
	 * @return 领域列表
	 * @throws DaoException, DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public List findByHqlNameAndDomian(IDomainProvider domainProvider, String queryName,Map qryParamMap) throws DaoException, DaoConfigException;
	@SuppressWarnings("unchecked")
	public List findByHqlNameAndDomian(String queryName,Map qryParamMap) throws DaoException, DaoConfigException;
	/**
	 *
	 * <br/>方法描述:依据领域名称和查询定义别名查询记录,并按分页获取
	 * @param domainProvider 领域提供者
	 * @param queryName 查询定义别名
	 * @param qryParamMap 查询参数Map
	 * @param page 分页对象
	 * @return list 领域列表
	 * @throws DaoException
	 * @throws DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public List findByHqlNameAndDomian(IDomainProvider domainProvider,
			String queryName, Map qryParamMap,Page page) throws DaoException,
			DaoConfigException ;
	/**
	 * 依据领域名称和查询定义别名查询符合条件的第一条记录
	 *
	 * @param domainProvider 领域提供者
	 * @param qryParams 查询参数数组
	 * @return 符合条件的第一条记录
	 * @throws DaoException, DaoConfigException
	 */
	public Object findUniqueByHqlNameAndDomian(IDomainProvider domainProvider,
			String queryName, Object[] qryParams) throws DaoException,
			DaoConfigException;
	/**
	 * 依据领域名称和查询定义别名查询符合条件的第一条记录
	 *
	 * @param domainProvider 领域提供者
	 * @param qryParamMap 查询参数Map
	 * @return 符合条件的第一条记录
	 * @throws DaoException, DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public Object findUniqueByHqlNameAndDomian(IDomainProvider domainProvider,
			String queryName, Map qryParamMap) throws DaoException,
			DaoConfigException;




	/**
	 * 依据领域名称和查询定义别名获得查询的hql
	 *
	 * @param domainName 领域名称
	 * @param queryName 查询名称
	 * @return hql字符串
	 * @throws DaoConfigException
	 */
	public String getHqlByDomainAndName(IDomainProvider domainProvider, String queryName)
	throws DaoConfigException;

	/**
	 * <br/>方法描述:依据领域名称和Hql语句定义(crud)执行新增\修改\删除
	 * @param domainProvider 领域提供者
	 * @param crudHqlName 按参数名字绑定的hql语句
	 * @param hqlParamMap 绑定的参数集合
	 * @throws DaoException
	 * @throws DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public void exeByHqlNameAndDomian(IDomainProvider domainProvider, String crudHqlName,
			Map hqlParamMap) throws DaoException, DaoConfigException;
	/**
	 *
	 * <br/>方法描述:依据领域名称和sql语句定义(crud)执行新增\修改\删除
	 * @param domainProvider 领域提供者
	 * @param crudSqlName 按参数名字绑定的sql语句
	 * @param sqlParamMap 绑定的参数集合
	 * @throws DaoException
	 * @throws DaoConfigException
	 */
	/*public void exeBySqlNameAndDomian(IDomainProvider domainProvider,String crudSqlName, Map sqlParamMap)
	throws DaoException, DaoConfigException;*/

	/**
	 *
	 * <br/>方法描述:基于动态bean的组合查询
	 * @param domainProvider  领域提供者
	 * @param queryBean       动态查询bean
	 * @return
	 * @throws DaoException
	 * @throws DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public List criteriaByQueryBeanAndDomian(IDomainProvider domainProvider,
			Object queryBean) throws DaoException,DaoConfigException;

	/***
	 *
	 * <br/>方法描述:处理持久化层异常的通用方法
	 * @param e
	 * @param errMsg
	 * @return
	 */
	public DaoException handleDaoException(Exception e, String errMsg);

	/***
	 *
	 * <br/>方法描述:处理持久化层异常的通用方法
	 * @param e
	 * @return
	 */
	public DaoException handleDaoException(Exception e);

	/***
	 *
	 * <br/>方法描述:处理持久化层配置信息异常的通用方法
	 * @param e
	 * @param errMsg
	 * @return
	 */
	public DaoConfigException handleDaoConfigException(Exception e, String errMsg);

	/***
	 *
	 * <br/>方法描述:处理持久化层配置信息异常的通用方法
	 * @param e
	 * @return
	 */
	public DaoConfigException handleDaoConfigException(Exception e);

	/**
	 * 依据领域名称和查询定义别名查询记录无需关注select子句内容
	 * @param domainProvider 领域提供者
	 * @param queryName 查询定义别名
	 * @param qryParams 查询参数Map
	 * @return 领域列表
	 * @throws DaoException, DaoConfigException
	 */
	@SuppressWarnings("unchecked")
	public Map findByHqlNameAndDomianByPageWithoutAttentionSelectCauseContent(IDomainProvider domainProvider, String queryName,
			Map qryParamMap,int startPos ,int recordNum) throws DaoException, DaoConfigException;
	
}
